package org.huawei260.TiKu.ODsuanfa;

import java.util.LinkedList;
import java.util.Scanner;
public class E_2024E_3708__BFS周末爬山 {

//	public class Main {
		static int m;
		static int n;
		static int k;
		static int[][] matrix;
		static int[][] offsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

		static int maxHeight;
		static int minStep;

		public static void main(String[] args) {
			Scanner sc = new Scanner(System.in);

			m = sc.nextInt();
			n = sc.nextInt();
			k = sc.nextInt();

			matrix = new int[m][n];
			for (int i = 0; i < m; i++) {
				for (int j = 0; j < n; j++) {
					matrix[i][j] = sc.nextInt();
				}
			}

			System.out.println(getResult());
		}

		public static String getResult() {
			// 到达matrix[0][0]高度的山峰，最短步数是0
			maxHeight = matrix[0][0];
			minStep = 0;

			// 广搜
			bfs();

			if (minStep == 0) {
				// 输出描述：如果没有可以爬的山峰，则高度和步数都返回0。
				return "0 0";
			} else {
				return maxHeight + " " + minStep;
			}
		}

		public static void bfs() {
			// 广搜队列
			LinkedList<int[]> queue = new LinkedList<>();
			// 访问记录
			boolean[][] visited = new boolean[m][n];

			// 首先是(0,0)位置进入队列，且被标记为访问过
			queue.add(new int[] {0, 0});
			visited[0][0] = true;

			// 此时消耗步数为0
			int step = 0;

			while (queue.size() > 0) {
				// 这里没有用queue.removeFirst来控制广搜，而是使用newQueue来控制广搜，因为这样更方便操作step
				LinkedList<int[]> newQueue = new LinkedList<>();
				step++;

				// 遍历同一层的所有节点
				for (int[] lastPos : queue) {
					int x = lastPos[0];
					int y = lastPos[1];

					int lastHeight = matrix[x][y];

					// 四个方向位置
					for (int[] offset : offsets) {
						int newX = x + offset[0];
						int newY = y + offset[1];

						// 新位置越界则无法继续广搜
						if (newX < 0 || newX >= m || newY < 0 || newY >= n) continue;

						// 新位置已访问过，则无需重复广搜
						if (visited[newX][newY]) continue;

						int curHeight = matrix[newX][newY];

						// 前后位置高度差在k以内, 则可以进入新位置
						if (Math.abs(curHeight - lastHeight) <= k) {
							// 标记新位置已访问
							visited[newX][newY] = true;

							// 如果此时到达新位置高度的步数step更小，则更新对应高度的最小步数
							if (curHeight > maxHeight || (curHeight == maxHeight && step < minStep)) {
								maxHeight = curHeight;
								minStep = step;
							}

							// 新位置加入下一层广搜队列
							newQueue.add(new int[] {newX, newY});
						}
					}
				}

				queue = newQueue;
			}
		}
	}